%pip install -r requirements.txt
Requirement already satisfied: scipy in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 1)) (1.5.2) Requirement already satisfied: wavfile in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 2)) (4.4.0) Requirement already satisfied: rir-generator in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 3)) (0.2.0) Requirement already satisfied: bitstring in c:\users\stast\anaconda3\lib\site-packages (from -r requirements.txt (line 4)) (3.1.9) Requirement already satisfied: numpy>=1.14.5 in c:\users\stast\anaconda3\lib\site-packages (from scipy->-r requirements.txt (line 1)) (1.19.2) Requirement already satisfied: cffi>=1.1.0 in c:\users\stast\anaconda3\lib\site-packages (from rir-generator->-r requirements.txt (line 3)) (1.14.3) Requirement already satisfied: pycparser in c:\users\stast\anaconda3\lib\site-packages (from cffi>=1.1.0->rir-generator->-r requirements.txt (line 3)) (2.20) Note: you may need to restart the kernel to use updated packages.
import IPython
import soundfile as sf
import numpy as np
import matplotlib.pyplot as plt
import scipy
import sys
from huffman_encoding import HuffmanEncoder
signal, fs = sf.read("guitar_sample.wav", always_2d=True)
byte_representation = signal.tobytes()
huffman_encoder = HuffmanEncoder()
huffman_encoder.initialize(byte_representation)
encoded_signal = huffman_encoder.encode(byte_representation)
print(f"""Theoretical entropy: {huffman_encoder.get_entropy(): .3f}
Bits per byte in encoding: {len(encoded_signal) / len(byte_representation) : .3f}
Compression ratio: {len(encoded_signal) / len(byte_representation) / 8 : .3f}""")
Theoretical entropy: 4.127 Bits per byte in encoding: 4.140 Compression ratio: 0.517
decoded_signal_bytes = huffman_encoder.decode(encoded_signal)
restored_signal = np.frombuffer(decoded_signal_bytes)
restored_signal = np.reshape(restored_signal, newshape=(restored_signal.shape[0] // 2, 2))
assert np.array_equal(signal, restored_signal)
IPython.display.Audio(restored_signal.T, rate=fs, autoplay=True)
IPython.display.Audio(signal.T, rate=fs, autoplay=True)